#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>

static void handler(int signum)
{
    std::cout << "获取一个信号：" << signum << std::endl;
}

static void showPending(sigset_t &pending)
{
    for (int sig = 31; sig >=1; sig--)
    {
        if (sigismember(&pending, sig))
            std::cout << "1";
        else
            std::cout << "0";
    }
    std::cout << std::endl;
}

static void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset,sig);
    int n=sigprocmask(SIG_BLOCK,&bset,nullptr);
    assert(n==0);
    (void)n;
}


int main()
{
    for(int sig=1;sig<=31;sig++)
    {
        blockSig(sig);
    }

    sigset_t pending;
    while(true)
    {
        sigpending(&pending);
        showPending(pending);
        sleep(1);
    }





    // // 1.方便测试，捕捉2号信号，不要退出
    // // signal(2,handler);
    // // 2. 定义信号集对象
    // sigset_t pending;
    // sigset_t obset, bset; // 以便保留旧的信号屏蔽字
    // // 3. 初始化
    // sigemptyset(&bset);
    // sigemptyset(&obset);
    // sigemptyset(&pending);
    // // 4. 添加要进行屏蔽的信号
    // sigaddset(&bset, 2 /*SIGINT*/);
    // // 5. 设置set到内核中对应的进程内部，修改block位图[默认情况进程不会对任何信号进行block]，
    // int n = sigprocmask(SIG_BLOCK, &bset, &obset);
    // assert(n == 0);
    // (void)n; // assert是宏定义，在release下无效，会报警告

    // std::cout << "block 2 号信号成功...., pid: " << getpid() << std::endl;
    // int count = 0;
    // while (true)
    // {
    //     // 获取当前进程的pending信号集
    //     sigpending(&pending);
    //     // 显示pending信号集中的没有被递达的信号
    //     showPending(pending);
    //     sleep(1);
    //     count++;

    //     if (count == 20)
    //     {
    //         std::cout << "解除对于2号信号的block" << std::endl;
    //         int n = sigprocmask(SIG_SETMASK, &obset, nullptr);
    //         assert(n == 0);
    //         (void)n;
    //     }
    // }

    return 0;
}

// int main()
// {
//     for(int i=1;i<=31;i++)//捕捉所以信号
//     signal(i,handler);

//     while(true) sleep(1);
//     return 0;
// }